interface Bird {
    fly();
    layEggs();
}


interface Fish {
    swim();
    layEggs();
}

function getSmallPet2():Fish|Bird{
    return {
        layEggs:()=>{},
        // swim:()=>{}
        fly:()=>{}
    }
}

let pet2 = getSmallPet2()
pet2.layEggs
// 方法1
// 使用断言 来判断到底会返回那种类型的数据结构
// if((<Fish>pet2).swim){
//     (<Fish>pet2).swim()
// }else{
//     (<Bird>pet2).fly()
// }

// 方法2 断言封装
function isFish(pet:Fish|Bird):pet is Fish {
    // pet is Fish就是类型谓词。 谓词为 parameterName is Type这种形式， 
    // parameterName必须是来自于当前函数签名里的一个参数名。
    return (<Fish>pet).swim !== undefined
}
if(isFish(pet2)){
    pet2.swim()
}else{
    pet2.fly()
}
